// 创建全局键盘钩子, 监听键盘消息, 可当热键使用或其他用途.
package main

import (
	"fmt"
	app "gitee.com/go_888/xcgui/xcgui/app"
	wapi "gitee.com/go_888/xcgui/xcgui/wapi"
	wutil "gitee.com/go_888/xcgui/xcgui/wapi/wutil"
	widget "gitee.com/go_888/xcgui/xcgui/widget"
	window "gitee.com/go_888/xcgui/xcgui/window"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
)

func main() {
	// 1.初始化UI库
	a := app.X创建(true)
	// 启用自适应DPI
	a.X启用DPI(true)
	a.X启用自动DPI(true)
	// 2.创建窗口
	w := window.X创建窗口(0, 0, 430, 300, "全局键盘钩子", 0, xcc.X窗口样式_默认样式)

	widget.X创建形状文本(40, 40, 300, 30, "在任何窗口按键都能够监听到", w.X句柄)
	widget.X创建编辑框(40, 80, 300, 30, w.X句柄).X设置焦点()
	checkBtn := widget.X创建按钮(40, 120, 300, 30, "拦截A键按下", w.X句柄).X设置类型EX(xcc.X对象扩展类型_复选按钮)
	checkBtn.X启用背景透明(true)

	kbHook := wutil.X创建全局键盘钩子(func(nCode int32, wParam xcc.X窗口事件, lParam *wapi.X结构体_键盘输入事件) uintptr {
		if nCode < 0 { // nCode小于0时不应继续处理
			return wutil.X调用下一个键盘钩子(nCode, wParam, lParam)
		}

		if wParam == xcc.X窗口事件_键盘_按键 { // 键盘按下
			if checkBtn.X取状态EX() == xcc.X按钮状态_选中 {
				if lParam.VkCode == xcc.X按键_A {
					fmt.Println("拦截了A键按下, 是不会输入文本框的, 部分程序不会被拦截, 自行研究")
					return 1 // 返回1可拦截, 这时按下A键是不会输入文本框的, 部分程序不会被拦截, 因为它可能进行了特殊处理
				}
			}
			fmt.Printf("按键按下: 虚拟键码=%d, 扫描码=%d\n", lParam.VkCode, lParam.ScanCode)
		} else if wParam == xcc.X窗口事件_键盘_按键弹起 { // 键盘弹起
			fmt.Printf("按键弹起: 虚拟键码=%d, 扫描码=%d\n", lParam.VkCode, lParam.ScanCode)
		}
		return wutil.X调用下一个键盘钩子(nCode, wParam, lParam)
	})

	w.X事件_关闭(func(pbHandled *bool) int {
		kbHook.X卸载全局键盘钩子()
		return 0
	})

	// 3.显示窗口
	w.X显示(true)
	// 4.运行程序
	a.X运行()
	// 5.释放UI库
	a.X退出()
}
